查看原文
其他

Adaptive Performance:高品质画面呈现与流畅稳定帧率的二者兼得

Unity Unity官方平台 2022-05-07

在GDC 2019上,Unity在Keynote主题演讲中介绍了Adaptive Performance自适应性能功能。Adaptive Performance预览版和《Megacity》移动端示例项目已经发布,开发者可以开始尝试它的功能。


本文将介绍Adaptive Performance自适应性能功能的详细信息,以及如何将其应用到项目中。


游戏性能与画面呈现的平衡

与PC或主机游戏不同,利用移动设备的完整性能要求对游戏有着精妙的平衡,这样才能使游戏既画面精美又运行流畅。


透支设备的性能会很快降低游戏性能,对硬件产生过大的负担,从而损害电池寿命并产生不稳定的性能。对于开发者而言,考虑到从低端到高端目标设备的庞大设备范围,这个问题会更加棘手。


目前有不同的方法可以解决该问题,其中二个主要方法是:

  • 尝试让游戏在所有目标硬件都有最好的运行效果,这意味着要牺牲图形保真度和帧率。

  • 尝试预测硬件行为,但准确测量硬件趋势的选择并不多,所以该方法很难实现。


Adaptive Performance

Adaptive Performance提供了一种更好的方法来管理游戏在设备上的实时热量和性能情况,使开发者能够主动的即时调整游戏性能和质量设置,利用好硬件性能,并避免过度使用设备性能。


Adaptive Performance可以获得更为可预测的帧率,减少热量积累,实现更长的运行时间和更加舒适的玩家体验,同时保持电池寿命。

 

对开发者而言,Adaptive Performance会对硬件进行全新的深度分析,使用新工具让游戏更加动态而灵活,在移动设备运行游戏时,给玩家提供最流畅和最优质的体验。


Adaptive Performance会给开发者提供操作系统的常用控制功能,例如:何时运行在高速时钟运转下,避免节流时要调整什么部分。


与三星合作改进Adaptive Performance

我们与全球最大的Android移动设备制造商三星进行合作,从而让Adaptive Performance解决方案走向成熟。


Adaptive Performance自适应性能功能基于三星的GameSDK构建,它会首先适用于Samsung Galaxy系列设备,例如:Samsung Galaxy S10和Galaxy Fold,未来该功能会支持更多Samsung Galaxy设备。


运行结果

下面的图表,我们在Unity GDC 2019 Keynote主题演讲上进行了展示,说明了当《Megacity》项目在全新Samsung Galaxy S10设备上运行时,Adaptive Performance有助于提供稳定的高帧率效果。



我们看见蓝线代表添加了Adaptive Performance后,与未添加功能的红线对比,Megacity》演示项目运行在30 fps的状态下的时间更长,也更加稳定。


使用《Megacity》展示Adaptive Performance

《Megacity》项目是一个包含数百万个实体的未来主义风格交互式城市,它展示了Unity如何在当今移动硬件上运行极为复杂的项目。

 

《Megacity》展示Unity面向数据技术栈DOTS的最新功能,包括:实体组件系统ECS,Native Collections本地工具组件,C# Job System和Burst编译器。


 

《Megacity》项目是展示Adaptive Performance的正确选择,它为我们提供了灵活而动态地适应游戏,主动地利用好硬件性能。Adaptive Performance在开发时考虑到了可扩展性,适用于构建《Megacity》基础的DOTS功能。

 

《Megacity》项目的移动版本有450万个网格渲染器,20万个建筑部分,10万个音频源,以及超过600万个实体,它是展示Adaptive Performance自适应性能功能理想的选择。


对《Megacity》的处理方式

通过Unity资源包管理器安装Adaptive Performance后,在向设备构建时,Unity会自动添加Samsung GameSDK子系统到项目中。


在运行时期间,Unity会在支持设备上创建并启动Adaptive Performance Manager管理器,该功能会提供移动设备热量状态的反馈。


开发者可以在运行时期间从Adaptive Performance Manager订阅事件或查询信息,从而实时对不同情况做出反应,否则,它只会在Console控制台报告状态。

 

例如:开发者可以使用我们提供的API,创建在设备上对热量趋势和事件做出反应的应用程序,这可确保较长时间的稳定帧率,同时在节流开始前避免发生热量节流。



在《Megacity》的Adaptive Performance示例实现中,我们使用了以下方法进行优化帧率:

 

  • 从较低CPU和GPU级别开始,逐渐提高它们的级别,从而消除瓶颈情况,这样可以保持较低的电量消耗。


  • 如果发现设备即将发生节流情况,我们可以调整质量设置以减少热量负载,并且决定降低LOD层级。

     

  • 一旦即将发生节流时,我们也会减少目标帧率。


  • 当达到目标帧率且温度正在下降时,我们会提高LOD层级,提高目标帧率,再次减少CPU和GPU级别。

 

这些功能可以让你的游戏在一段时间内实现更流畅的性能。通过密切关注设备的热量趋势,开发者可以动态的调整性能设置,避免节流情况。

 

了解如何实现这种效果,请下载《Megacity》移动示例项目:

http://megacity.unity3d.com/MegaCity_Mobile_AdaptivePerformance_Release.zip


Adaptive Performance Manager

该资源包的核心是Unity在启动时创建的Adaptive Performance Manager管理器,它允许开发者轻松访问和订阅热量和性能事件。

 

下面的示例代码展示了如何在MonoBehaviour的Start函数使用IAdaptivePerformance接口来访问Adaptive Performance Manager管理器。

private IAdaptivePerformance ap = null; 

 

void Start() 

    ap = Holder.instance; 

}

热量事件

当移动设备的热量状态发生变化,Unity就会发送热量事件,重要的状态有:即将发生节流的时候和节流情况已经发生的时候。

 

在下面的示例代码中,我们会订阅ThermalEvents,以减少或提高lodBias,这有助于减少GPU负载。

using UnityEngine; 

using UnityEngine.Mobile.AdaptivePerformance; 

  

public class AdaptiveLOD : MonoBehaviour 

    private IAdaptivePerformance ap = null; 

 

    void Start() { 

        if (Holder.instance == null) 

            return; 

 

        ap = Holder.instance; 

 

        if (!ap.active) 

            return; 

 

        QualitySettings.lodBias = 1; 

 

        ap.ThermalEvent += OnThermalEvent; 

    } 

 

    void OnThermalEvent(object obj, ThermalEventArgs ev) { 

        switch (ev.warningLevel) { 

            case PerformanceWarningLevel.NoWarning: 

                QualitySettings.lodBias = 1; 

                break; 

            case PerformanceWarningLevel.ThrottlingImminent: 

                QualitySettings.lodBias = 0.75f; 

                break; 

            case PerformanceWarningLevel.Throttling: 

                QualitySettings.lodBias = 0.5f; 

                break; 

        } 

    } 

}


如果我们减少lodBias到数值1以下,它会在很多情况下产生视觉影响,发生LOD对象突然改变的情况,但如果对游戏体验没有要求的话,这是减少图形负载的简单方法。


如果想做出更细致的决策来调整游戏图形和行为的处理方法,瓶颈事件会非常实用。


CPU和GPU性能级别

移动设备的CPU和GPU占了功耗的很大一部分,特别是在运行游戏时。

 

CPU内核和GPU运行在最大时钟速度时的效率较低,运行在高时钟速度下容易使移动设备温度过高,此时操作系统会限制CPU和GPU的频率来降低设备温度。

 

我们可以使用以下属性,通过限制最大允许时钟速度避免发生这种情况:

  • IAdaptivePerformance.cpuLevel

  • IAdaptivePerformance.gpuLevel

 

应用程序可以基于对当前性能要求的信息来配置这二个属性,并且基于实际情况决定应该提高还是降低级别。

  • 应用程序是否在之前帧达到目标帧率? 

  • 应用程序是位于游戏内场景还是菜单位置?

  • 接下来是否有性能消耗较大的场景?

  • 即将发生的事件是否利用大量CPU或GPU性能?

  • 是否展示不需要高CPU或GPU级别的广告?

 

public void EnterMenu(){  

    if (!ap.active) 

        return;  

 

    // 在菜单设置低CPU和GPU级别

    ap.cpuLevel = 0; 

    ap.gpuLevel = 0; 


    // 设置低目标FPS

    Application.targetFrameRate = 15; 

 

public void ExitMenu(){  

    // 在回到游戏时,设置较高CPU和GPU级别

    ap.cpuLevel = ap.maxCpuPerformanceLevel; 

    ap.gpuLevel = ap.maxGpuPerformanceLevel; 

}

性能瓶颈的警告系统

在Adaptive Performance Manager管理器中,我们可以订阅接收性能瓶颈事件,了解游戏是CPU绑定,GPU绑定还是“帧率绑定”。


帧率绑定意味着游戏受到了Application.targetFrameRate的限制,这种情况下应用程序应该考虑降低性能要求。

 

GPU Framtime Driver帧率控制工具会运行在后台,管理瓶颈决策,开发者可以通过Adaptive Performance Manager管理器查询信息,它会监视上一帧GPU使用的硬件时间。

 

目前,CPU时间通过累计Unity内部子系统所用时间来计算。根据游戏和实际情况,开发者可以让工具根据热量状态变化,在游戏处于CPU绑定时或GPU绑定时使用不同的应对方法。

void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) { 

    switch (ev.bottleneck) { 

        case PerformanceBottleneck.TargetFrameRate: 

            if (ap.cpuLevel > 0) {

                ap.cpuLevel--;

            }

           if (ap.gpuLevel > 0) {

                ap.gpuLevel--;

            }

            break; 

        case PerformanceBottleneck.GPU: 

            if (ap.gpuLevel < ap.maxGpuPerformanceLevel) {

                ap.gpuLevel++;

            }

            break; 

        case PerformanceBottleneck.CPU: 

            if (ap.cpuLevel < ap.maxCpuPerformanceLevel) {

                ap.cpuLevel++;

            }

            break; 

    } 

}


对游戏进行优化的方法很多,上述示例和《Megacity》项目的示例只提供了一些优化的建议,游戏的优化归根结底取决于最适合特定游戏的方法。


Adaptive Performance更多信息,请访问帮助文档:

https://docs.unity3d.com/Packages/com.unity.mobile.adaptiveperformance@latest


未来发展

现在仅仅只是开始,我们会继续开发Adaptive Performance自适应性能功能,添加更多功能并支持更多设备。

 

当前资源包提供一个底层API,而我们已经在开发基于组件的高层次API,它兼容DOTS,能够在Unity项目轻松适应性能。


Adaptive Performance预览版已通过Unity资源包管理器面向Unity 2019.1 Beta发布,了解相关最新信息,以及其他开发者的使用方法,请访问Unity官方论坛:

https://forum.unity.com/threads/adaptive-performance-package.652306/



推荐阅读


Unite Shanghai 2019

5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。

购票请访问:Unite2019.csdn.net



点击“阅读原文”访问Unity Connect

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存